home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / powervww / compile.cpp next >
C/C++ Source or Header  |  1998-01-05  |  25KB  |  734 lines

  1. //  ____________________________________________________
  2. // |                                                    |
  3. // |  Project:     POWER VIEW IDE                       |
  4. // |  File:        COMPILE.CPP                          |
  5. // |  Compiler:    WPP386 (10.6)                        |
  6. // |                                                    |
  7. // |  Subject:     Compile & Link stuff                 |
  8. // |                                                    |
  9. // |  Author:      Emil Dotchevski                      |
  10. // |____________________________________________________|
  11. //
  12. // E-mail: zajo@geocities.com
  13. // URL:    http://www.geocities.com/SiliconValley/Bay/3577
  14.  
  15. #define uses_errno
  16. #define uses_fcntl
  17. #define uses_io
  18. #define uses_malloc
  19. #define uses_process
  20. #define uses_stdio
  21. #define uses_string
  22.  
  23. #define uses_app
  24. #define uses_ht
  25. #define uses_icons
  26. #define uses_input
  27. #define uses_stddlg
  28. #define uses_system
  29. #define uses_table
  30. #define uses_time
  31. #define uses_txt
  32.  
  33. #include "PVUSES.H"
  34. #include "W.H"
  35. #include "TLOG.H"
  36. #include "TPROJECT.H"
  37.  
  38. #define _DECLARE_COMPILE_H
  39.   #include "COMPILE.H"
  40. #undef  _DECLARE_COMPILE_H
  41.  
  42.  
  43. /*
  44. DEFINES
  45. */
  46.   #define TRAP_FNAME      "PVTRAP.TMP"
  47.   #define ERR_FNAME       "PVERR.TMP"
  48.   #define OPT_FNAME       "PVOPT.TMP"
  49.  
  50.  
  51. /*
  52. MAKE STATUS
  53. */
  54.   static int make_counter = 0;
  55.   static char *make_title = "";
  56.   void start_of_make( char *_make_title )
  57.   {
  58.     if( make_counter++ ) return;
  59.     make_title = _make_title;
  60.     log->clear();
  61.     log->redraw();
  62.   }
  63.  
  64.   void make_status( char *current_file, char *target_file, char *status )
  65.   {
  66.     char *prj;
  67.     char fname1[_MAX_FNAME], ext1[_MAX_EXT];
  68.     char fname2[_MAX_FNAME], ext2[_MAX_EXT];
  69.     char fname3[_MAX_FNAME], ext3[_MAX_EXT];
  70.  
  71.     prj = "";
  72.     if( project != NULL ) prj = project->filename;
  73.     _splitpath( prj,          NULL, NULL, fname1, ext1 );
  74.     _splitpath( current_file, NULL, NULL, fname2, ext2 );
  75.     _splitpath( target_file,  NULL, NULL, fname3, ext3 );
  76.     _title( make_title );
  77.     _taleft();
  78.     _dialog_xy( desktop_xl - 44, 2 );
  79.     action( "Project:      %s%s\n\nCurrent file: %s%s\nTarget file:  %s%s\n\n%s",
  80.             fname1, ext1, fname2, ext2, fname3, ext3, status );
  81.   }
  82.  
  83.   void end_of_make( int show_log )
  84.   {
  85.     if( --make_counter ) return;
  86.     make_title = "";
  87.     done_action();
  88.     if( log->vcount && show_log ) log->show_first_error();
  89.     log->redraw();
  90.     idle( 0 );
  91.   }
  92.  
  93.  
  94. /*
  95. VALIDITY CHECKS
  96. */
  97.   static boolean check_system_time( char *filespec, uint date1, uint time1 )
  98.   {
  99.     time_t t;
  100.     struct tm tmbuf;
  101.     uint date0, time0;
  102.     unsigned long t0, t1;
  103.  
  104.     if( time_check!=cmCOM_TIMECHECK ) return 1;
  105.     t = time( NULL ); _localtime( &t, &tmbuf );
  106.     time0 = (tmbuf.tm_hour<<11)|(tmbuf.tm_min<<5)|(tmbuf.tm_sec/2);
  107.     date0 = ((tmbuf.tm_year-80)<<9)|((tmbuf.tm_mon+1)<<5)|(tmbuf.tm_mday);
  108.     t0 = (date0<<16)|time0;
  109.     t1 = (date1<<16)|time1;
  110.     if( t1>t0 )
  111.     {
  112.       char s[256];
  113.       strcpy( s, filespec );
  114.       min_path( s );
  115.       short_path( s, 30 );
  116.       _iwarning();
  117.       ok( "File %s has future time stamp (system time not valid, eh?)", s );
  118.       return 0;
  119.     }
  120.     return 1;
  121.   }
  122.  
  123.   boolean target_valid( char *target, char *source )
  124.   //returns 1 if target based on source is valid
  125.   {
  126.     uint date1, date2, time1, time2;
  127.     unsigned long t1, t2;
  128.  
  129.     if( !get_date_time( target, date1, time1 ) ) return 0;
  130.     if( file_size( target ) <= 0 ) return 0;
  131.     if( ( source == NULL ) || !get_date_time( source, date2, time2 ) ) return 1;
  132.     t1 = (date1<<16)|time1; t2 = (date2<<16)|time2;
  133.     if( !check_system_time( target, date1, time1 ) ||
  134.         !check_system_time( source, date2, time2 ) ) return 1;
  135.     return t1>=t2;
  136.   }
  137.  
  138.   boolean need_make( char *filename )
  139.   //check validity of an WATCOM OBJ file
  140.   {
  141.     FILE *f;
  142.     char path[_MAX_PATH], dfile[_MAX_PATH];
  143.     long ofs;
  144.     uint file_date, file_time, date, time, size;
  145.     char type, l;
  146.     char _class;
  147.     boolean result, ok;
  148.  
  149.     if( file_size( filename ) <= 0 ) return 1;
  150.     get_date_time( filename, file_date, file_time );
  151.     if( !check_system_time( filename, file_date, file_time ) ) return 0;
  152.     fexpand( strcpy( path, filename ) );
  153.     f = fopen( path, "rb" );
  154.     if( f == NULL ) return 1;
  155.     result = 0;
  156.     ok = 0;
  157.     while( !feof( f ) && !ferror( f ) )
  158.     {
  159.       type = 0; size = 0; _class = 0; type = 0;
  160.       fread( &type, 1, 1, f );
  161.       fread( &size, 2, 1, f );
  162.       if( size == 0 ) break;
  163.       ofs = ftell( f );
  164.       fread( &_class, 1, 1, f );
  165.       fread( &_class, 1, 1, f );
  166.       if( ( type == 0x88 ) && ( _class == 0xE9 ) )
  167.       {
  168.         ok = 1;
  169.         fseek( f, 4, SEEK_CUR );
  170.         fread( &l, 1, 1, f );
  171.         fread( dfile, l, 1, f );
  172.         dfile[l] = 0;
  173.         if( strstr( "\\WATCOM\\H\\", dfile )==NULL && get_date_time( dfile, date, time ) )
  174.         {
  175.           if( !check_system_time( dfile, date, time ) ) return 0;
  176.           if( ( file_date < date ) ||
  177.               ( ( file_date == date ) && ( file_time < time ) ) )
  178.           {
  179.             result = 1;
  180.             break;
  181.           }
  182.         }
  183.       }
  184.       else
  185.         if( ok ) break;
  186.       fseek( f, ofs + size, SEEK_SET );
  187.     }
  188.     fclose( f );
  189.     return result;
  190.   }
  191.  
  192.  
  193. /*
  194. SPAWNING
  195. */
  196.   static int redirect_handle( int base_handle, int to_handle )
  197.   //returns a duplicate of the base handle
  198.   {
  199.     int saved;
  200.  
  201.     saved = dup( base_handle );
  202.     dup2( to_handle, base_handle );
  203.     _dos_close( to_handle );
  204.     return saved;
  205.   }
  206.  
  207.   static void reset_handle( int saved_handle, int base_handle )
  208.   {
  209.     dup2( saved_handle, base_handle );
  210.     _dos_close( saved_handle );
  211.   }
  212.  
  213.   static char pv_mode;
  214.   static char pv_char_size;
  215.   void unhook_system( void )
  216.   {
  217.     pv_mode = scr_mode;
  218.     pv_char_size = scr_char_size;
  219. #ifndef NOMOUSE
  220.     hide_mouse();
  221. #endif
  222.     restore_dos_screen();
  223. #if !defined( NOICONS ) && !defined( HGR )
  224.     restore_graph_chars();
  225. #endif
  226.     unhook_drivers();
  227.   }
  228.  
  229.   void hook_system( void )
  230.   {
  231.     hook_drivers();
  232. #if !defined( NOICONS ) && !defined( HGR )
  233.     set_graph_chars();
  234. #endif
  235.     save_dos_screen();
  236.     set_video_mode( pv_mode, pv_char_size );
  237. #ifndef HGR
  238.     set_blink( 0 );
  239. #endif
  240. #ifndef NOMOUSE
  241.     show_mouse();
  242. #endif
  243.     application->redraw();
  244.   }
  245.  
  246.   int exec( uint flags, char *program, char *params, char *redirect, void *history_id )
  247.   //execute program w/ params, redirect output as described in flags
  248.   {
  249.     const static char *prms[] = { NULL, NULL, NULL };
  250.     FILE *f;
  251.     char parameters[_MAX_PATH];
  252.     char buffer[_MAX_PATH];
  253.     char *p;
  254.     int handle1, handle2, in_svd, out_svd, n;
  255.     boolean success, fsuccess, rsuccess;
  256.  
  257.     if( ( flags & teSAVE_CUR ) &&
  258.         ( current_editor != NULL ) &&
  259.         ( current_editor->booleans & ebMODIFIED ) ) message( (Titem *) current_editor->editor, cmSAVE );
  260.  
  261.     if( flags & teSAVE_ALL ) broadcast( cmSAVE_ALL );
  262.  
  263.     if( flags & tePROMPT )
  264.     {
  265.       show_cursor();
  266.       _help( htD_EXECUTE );
  267.       dialog( "Execute" );
  268.       _tselected(); _tacenter(); stext( "Program: %s", 43, program );
  269.       vspace();
  270.       _focused();
  271.       if( flags & teLONG_CMD )
  272.         memo( "|~File params", params, MAX_FILE_PARAMS, 40, 8 );
  273.       else
  274.       {
  275.         _history( history_id );
  276.         input( "|~Command line", params, 125, 25 );
  277.       }
  278.       boolean result = bkch();
  279.       hide_cursor();
  280.       if( !result ) return -1;
  281.     }
  282.  
  283.     if( ( flags & teLONG_CMD ) && ( strlen( params ) > 125 ) )
  284.     {
  285.       *parameters = '@';
  286.       f = fopen( tmp_fname( parameters + 1, OPT_FNAME ), "wt" );
  287.       if( f == NULL )
  288.       {
  289.         _terror();
  290.         ok( "Can't create command line parameters file \"%s\".", parameters+1 );
  291.         return -1;
  292.       }
  293.       fputs( params, f );
  294.       fclose( f );
  295.       if( ferror( f ) )
  296.       {
  297.         _terror();
  298.         ok( "Can't write command line parameters file \"%s\".", parameters+1 );
  299.         return -1;
  300.       }
  301.     }
  302.     else
  303.